package com.numberone.master.common.sensitive;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @Description: ��ʼ�����дʿ⣬�����дʼ��뵽HashMap�У�����DFA�㷨ģ��
 * @Project��test
 * @Author : chenming
 * @Date �� 2014��4��20�� ����2:27:06
 * @version 1.0
 */
public class SensitiveWordInit {
	private String ENCODING = "UTF-8";    //�ַ����
	@SuppressWarnings("rawtypes")
	public HashMap sensitiveWordMap;
	
	public SensitiveWordInit(){
		super();
	}
	
	/**
	 * @author chenming 
	 * @date 2014��4��20�� ����2:28:32
	 * @version 1.0
	 */
	@SuppressWarnings("rawtypes")
	public Map initKeyWord(){
		try {
			//��ȡ���дʿ�
			Set<String> keyWordSet = readSensitiveWordFile();
			//�����дʿ���뵽HashMap��
			addSensitiveWordToHashMap(keyWordSet);
			//spring��ȡapplication��Ȼ��application.setAttribute("sensitiveWordMap",sensitiveWordMap);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sensitiveWordMap;
	}

	/** 
     * 读取敏感词库，将敏感词放入HashSet中，构建一个DFA算法模型：<br> 
     * 中 = { 
     *      isEnd = 0 
     *      国 = {<br> 
     *           isEnd = 1 
     *           人 = {isEnd = 0 
     *                民 = {isEnd = 1} 
     *                } 
     *           男  = { 
     *                  isEnd = 0 
     *                   人 = { 
     *                        isEnd = 1 
     *                       } 
     *               } 
     *           } 
     *      } 
     *  五 = { 
     *      isEnd = 0 
     *      星 = { 
     *          isEnd = 0 
     *          红 = { 
     *              isEnd = 0 
     *              旗 = { 
     *                   isEnd = 1 
     *                  } 
     *              } 
     *          } 
     *      } 
     * @author chenming  
     * @date 2014年4月20日 下午3:04:20 
     * @param keyWordSet  敏感词库 
     * @version 1.0 
     */  
    @SuppressWarnings({ "rawtypes", "unchecked" })  
    private void addSensitiveWordToHashMap(Set<String> keyWordSet) {  
        sensitiveWordMap = new HashMap(keyWordSet.size());     //初始化敏感词容器，减少扩容操作  
        String key = null;    
        Map nowMap = null;  
        Map<String, String> newWorMap = null;  
        //迭代keyWordSet  
        Iterator<String> iterator = keyWordSet.iterator();  
        while(iterator.hasNext()){  
            key = iterator.next();    //关键字  
            nowMap = sensitiveWordMap;  
            for(int i = 0 ; i < key.length() ; i++){  
                char keyChar = key.charAt(i);       //转换成char型  
                Object wordMap = nowMap.get(keyChar);       //获取  
                  
                if(wordMap != null){        //如果存在该key，直接赋值  
                    nowMap = (Map) wordMap;  
                }  
                else{     //不存在则，则构建一个map，同时将isEnd设置为0，因为他不是最后一个  
                    newWorMap = new HashMap<String,String>();  
                    newWorMap.put("isEnd", "0");     //不是最后一个  
                    nowMap.put(keyChar, newWorMap);  
                    nowMap = newWorMap;  
                }  
                  
                if(i == key.length() - 1){  
                    nowMap.put("isEnd", "1");    //最后一个  
                }  
            }  
        }  
    }  

	/**
	 * ��ȡ���дʿ��е����ݣ���������ӵ�set������
	 * @author chenming 
	 * @date 2014��4��20�� ����2:31:18
	 * @return
	 * @version 1.0
	 * @throws Exception 
	 */
	@SuppressWarnings("resource")
	private Set<String> readSensitiveWordFile() throws Exception{
		Set<String> set = null;
		
		File file = new File("D:\\SensitiveWord.txt");    //��ȡ�ļ�
		InputStreamReader read = new InputStreamReader(new FileInputStream(file),ENCODING);
		try {
			if(file.isFile() && file.exists()){      //�ļ����Ƿ����
				set = new HashSet<String>();
				BufferedReader bufferedReader = new BufferedReader(read);
				String txt = null;
				while((txt = bufferedReader.readLine()) != null){    //��ȡ�ļ������ļ����ݷ��뵽set��
					set.add(txt);
			    }
			}
			else{         //�������׳��쳣��Ϣ
				throw new Exception("���дʿ��ļ�������");
			}
		} catch (Exception e) {
			throw e;
		}finally{
			read.close();     //�ر��ļ���
		}
		return set;
	}
	
}
